﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using System.Windows.Forms;

//Autor: Arturo Serna

namespace Librerias
{    
    /// <summary>
    /// Clase: CAD Mensaje
    /// </summary>
    class CADMensaje
    {
        SqlConnection con;

        /// <summary>
        /// Conecta con base de datos
        /// </summary>
        public CADMensaje() 
        {
            con = new SqlConnection(CADConexion.connString);
        }

        /// <summary>
        /// Devuelve DataTable con la bandeja de entrada de un usuario
        /// </summary>
        /// <param name="receptor">usuario</param>
        /// <returns>bandeja de entrada</returns>
        public DataTable BandejaEntrada(string receptor)
        {
            DataTable res = null;

                con.Open();

                string select = "select * from mensaje where menPropietario = '" + receptor 
                                + "' and menReceptor = '" + receptor + "' "
                                + " order by menDate desc";
                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

                res = new DataTable();
                adaptadorSQL.Fill(res);

                con.Close();

            return res;
        }

        /// <summary>
        /// Busca los mensajes de un usuario según:
        /// 0: Asunto
        /// 1: Mensaje
        /// 2: Emisor
        /// 3: Fecha
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="texto"></param>
        /// <param name="criterio"></param>
        /// <returns></returns>
        public DataTable Buscar(string usuario, string texto, int criterio)
        {
            DataTable res = null;

            con.Open();

            string select = "select * from mensaje where menPropietario = '" + usuario +  "' ";


            switch (criterio)
            {
                case 0:
                    select += " and menAsunto like '%" + texto + "%' ";
                    break;
                case 1:
                    select += " and menMensaje like '%" + texto + "%' ";
                    break;
                case 2:
                    select += " and menEmisor like '%" + texto + "%' ";
                    break;
                case 3:
                    select += " and menReceptor like '%" + texto + "%' ";
                    break;
            }

            select += " order by menDate desc";


            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res;
        }

        /// <summary>
        /// Devuelve mensajes enviados
        /// </summary>
        /// <param name="emisor"></param>
        /// <returns></returns>
        public DataTable MensajesEnviados(string emisor)
        {
            DataTable res = null;

            con.Open();

            string select = "select * from mensaje where menPropietario = '" + emisor
                             + "' and menEmisor = '" + emisor + "' "
                             + " order by menDate desc";
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res;
        }


        /// <summary>
        /// Devuelve el numero de mensajes totales
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int NumMensajesTotales(string usuario)
        {
            DataTable res = null;

            con.Open();

            string select = "select menId from mensaje where menPropietario = '" + usuario + "'";
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res.Rows.Count;
        }

        /// <summary>
        /// Devuelve el número de mensajes no leídos
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int NumMensajesNoLeidosTotales(string usuario)
        {
            DataTable res = null;

            con.Open();

            string select = "select menId from mensaje where menPropietario = '" + usuario + "'" +
                            " and menLeido = 0;";
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res.Rows.Count;
        }

        /// <summary>
        /// Devuelve el número de mensajes recibidos
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int NumRecibidos(string usuario)
        {
            DataTable res = null;

            con.Open();

            string select = "select menId from mensaje where menPropietario = '" + usuario 
                            + "' and menReceptor = '" + usuario + "'";
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res.Rows.Count;
        }

        /// <summary>
        /// Obtiene el número de mensajes recibidos no leídos
        /// </summary>
        /// <param name="usuario"></param>
        /// <returns></returns>
        public int NumRecibidosNoLeidos(string usuario)
        {
            DataTable res = null;

            con.Open();

            string select = "select menId from mensaje where menPropietario = '"
                            + usuario + "' and menReceptor = '" + usuario
                            +"' and menLeido = 0;";
            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res.Rows.Count;
        }

        /*
        public DataTable GetConversacion(string propietario, string usuario2, bool marcarComoLeido=true)
        {
            DataTable res = null;

            con.Open();

            string select = "select * from mensaje where (menEmisor   = '" + propietario   + "' "
                                                  +" and menReceptor = '" + usuario2 +
                                                  "') or (menEmisor   = '" + usuario2 + "' "
                                                  + " and menReceptor = '" + propietario + "') "
                                 + " order by menDate asc";

            //Marca como leído
            if (marcarComoLeido)
            {
                LeidoReceptor(propietario, usuario2);
            }

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res;
        }
        */

        /*
        public void LeidoReceptor(string propietario, string usuario2)
        {
            if ((new SqlCommand("update mensaje set menLeidoReceptor = 1 " +
                            "where menEmisor   = '" + propietario + "' "
                            + " and menReceptor = '" + usuario2 + "';", con)).ExecuteNonQuery() == -1) throw new Exception("Error al marcar mensajes como leidos");
        }*/

        /// <summary>
        /// Obtiene la secuencia de mensajes entre 1 o 2 usuarios con el mismo asunto
        /// </summary>
        /// <param name="asunto"></param>
        /// <param name="propietario"></param>
        /// <param name="usuario2"></param>
        /// <param name="marcarComoLeido"></param>
        /// <returns></returns>
        public DataTable GetConversacionByAsunto(string asunto, string propietario, string usuario2, bool marcarComoLeido = true)
        {
            DataTable res = null;

            con.Open();

            string select = "select * from mensaje where menPropietario = '" + propietario
                                                  + "' and ((menEmisor   = '" + propietario + "' "
                                                  + " and menReceptor = '" + usuario2 +
                                                  "') or (menEmisor   = '" + usuario2 + "' "
                                                  + " and menReceptor = '" + propietario + "')) "
                                                  + " and menAsunto = '" + asunto + "' "
                            + " order by menDate asc";

            SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);

            //Marca como leído
            if (marcarComoLeido)
            {
                if ((new SqlCommand("update mensaje set menLeido = 1 " +
                "where menPropietario = '" + propietario
                + "' and menEmisor   = '" + usuario2 + "' "
                + " and menReceptor = '" + propietario + "' "
                + " and menAsunto = '" + asunto + "';", con)).ExecuteNonQuery() == -1) throw new Exception("Error al marcar mensajes como leidos");
            }




            res = new DataTable();
            adaptadorSQL.Fill(res);

            con.Close();

            return res;
        }

        /// <summary>
        /// Crea un nuevo mensaje
        /// </summary>
        /// <param name="date"></param>
        /// <param name="emisor"></param>
        /// <param name="receptor"></param>
        /// <param name="asunto"></param>
        /// <param name="mensaje"></param>
        /// <param name="archivo"></param>
        /// <param name="barra"></param>
        public void NuevoMensaje(DateTime date, string emisor, string receptor, string asunto, string mensaje, string archivo, ProgressBar barra = null)
        {
            con.Open();

            string select;
                                    
            //Si no es un automensaje, hay que hacer una copia para el emisor y otra para el receptor
            if (emisor != receptor)
            {
                select = "insert into mensaje (menDate,menPropietario, menEmisor, menReceptor, menAsunto, menMensaje, menArchivo, menPuntuacion, menLeido) values('" +
                                    date + "','" +
                                    emisor + "','" +
                                    emisor + "','" +
                                    receptor + "','" +
                                    asunto + "','" +
                                    mensaje + "','" +
                                    archivo + "',0,1); "+
                            "insert into mensaje (menDate,menPropietario, menEmisor, menReceptor, menAsunto, menMensaje, menArchivo, menPuntuacion, menLeido) values('" +
                                    date + "','" +
                                    receptor + "','" +
                                    emisor + "','" +
                                    receptor + "','" +
                                    asunto + "','" +
                                    mensaje + "','" +
                                    archivo + "',0,0); ";
            }
                //lo automensajes no se copian
            else
            {
                select = "insert into mensaje (menDate,menPropietario, menEmisor, menReceptor, menAsunto, menMensaje, menArchivo, menPuntuacion, menLeido) values('" +
                                    date + "','" +
                                    emisor + "','" +
                                    emisor + "','" +
                                    receptor + "','" +
                                    asunto + "','" +
                                    mensaje + "','" +
                                    archivo + "',0,0); ";
            }


            SqlCommand com = new SqlCommand(select, con);

            if (com.ExecuteNonQuery() == -1) throw new Exception("Error al insertar");

            //Si hay un archivo lo tiene que subir a DropBox
            else if (archivo != "")
            {
                CADGestionDropbox drop = new CADGestionDropbox();

                //Obtengo id's
                select = "select menId from mensaje where menEmisor   = '" + emisor
                                      +"' and menReceptor = '" + receptor 
                                      +"' and menDate = '" + date 
                                      +"' and menAsunto = '" + asunto 
                                      +"' and menMensaje = '" + mensaje 
                                      +"' and menArchivo = '" + archivo + "'";

                SqlDataAdapter adaptadorSQL = new SqlDataAdapter(select, con);


                DataTable res = new DataTable();
                adaptadorSQL.Fill(res);


                string ruta = "/mensajes/"+res.Rows[0].ItemArray[0].ToString()+"/";

                drop.CreaDir(ruta);

                if (drop.Subir(archivo, ruta, barra))
                {
                    if (res.Rows.Count == 2)
                    {
                        if ((new SqlCommand("update mensaje set menArchivo = '" + ruta + CADGestionDropbox.GetFicheroFromRuta(archivo) + "'" +
                                            "where menId = " + res.Rows[0].ItemArray[0].ToString()
                                            + " or  menId   = " + res.Rows[1].ItemArray[0].ToString() + ";", con)).ExecuteNonQuery() == -1) throw new Exception("Error al subir el fichero");
                    }
                    else if (res.Rows.Count == 1)
                    {
                        if ((new SqlCommand("update mensaje set menArchivo = '" + ruta + CADGestionDropbox.GetFicheroFromRuta(archivo) + "'" +
                                            "where menId = " + res.Rows[0].ItemArray[0].ToString()+ ";", con)).ExecuteNonQuery() == -1) throw new Exception("Error al subir el fichero");
                    }
                }
                //Si no se sube el fichero debe borrarlo de la bd y lanzar excepción
                else
                {
                    if (res.Rows.Count == 2)
                    {
                        (new SqlCommand("update mensaje set menArchivo = ''"
                        + "where menId = " + res.Rows[0].ItemArray[0].ToString()
                        + " or  menId   = " + res.Rows[1].ItemArray[0].ToString() + ";", con)).ExecuteNonQuery();
                    }
                    else if (res.Rows.Count == 1)
                    {
                        (new SqlCommand("update mensaje set menArchivo = ''"
                        + "where menId = " + res.Rows[0].ItemArray[0].ToString()+ ";", con)).ExecuteNonQuery();
                    }
                    throw new Exception("Error al subir el fichero");
                }

            }
            con.Close();
        }

        /// <summary>
        /// Descarga adjunto de dropbox
        /// </summary>
        /// <param name="ruta"></param>
        /// <param name="salida"></param>
        /// <param name="barra"></param>
        /// <returns></returns>
        public bool Descargar(string ruta, string salida,ProgressBar barra)
        {
            return (new CADGestionDropbox()).Descargar(ruta, salida,barra);
        }

        /// <summary>
        /// Dado el id de un mensaje lo elimina
        /// </summary>
        /// <param name="id"></param>
        public void EliminarMensaje(int id)
        {
            con.Open();

            SqlCommand com = new SqlCommand("delete from mensaje where menId = " + id, con);
                        
            if (com.ExecuteNonQuery() == -1) throw new Exception("Error al eliminar");

            con.Close();
        }

        /// <summary>
        /// Dado un arraylist de id's de mensajes, los elimina
        /// </summary>
        /// <param name="ids"></param>
        public void EliminarMensaje(ArrayList ids)
        {
            if (ids.Count > 0)
            {
                con.Open();

                string select = "delete from mensaje where menId = " + ids[0];

                for (int i = 1; i < ids.Count; i++)
                {
                    select += " or menId = " + ids[i];
                }

                if (new SqlCommand(select, con).ExecuteNonQuery() == -1) 
                    throw new Exception("Error al eliminar");

                con.Close();
            }
        }

        /// <summary>
        /// Dado un arraylist de id's de mensajes, los marca como leidos
        /// </summary>
        /// <param name="ids"></param>
        public void MarcarLeido(ArrayList ids)
        {
            if (ids.Count > 0)
            {
                con.Open();

                string select = "update mensaje set menLeido = 1 where menId = " + ids[0];

                for (int i = 1; i < ids.Count; i++)
                {
                    select += " or menId = " + ids[i];
                }

                if (new SqlCommand(select, con).ExecuteNonQuery() == -1)
                    throw new Exception("Error al eliminar");

                con.Close();
            }
        }

        /// <summary>
        /// Dado un arraylist de id's de mensajes, los marca como no leidos
        /// </summary>
        /// <param name="ids"></param>
        public void MarcarNoLeido(ArrayList ids)
        {
            if (ids.Count > 0)
            {
                con.Open();

                string select = "update mensaje set menLeido = 0 where menId = " + ids[0];

                for (int i = 1; i < ids.Count; i++)
                {
                    select += " or menId = " + ids[i];
                }

                if (new SqlCommand(select, con).ExecuteNonQuery() == -1)
                    throw new Exception("Error al eliminar");

                con.Close();
            }
        }
    }
}
